#include"Slist.h"

SListNode* BuySListNode(SLTDateType x)
{
  SListNode* ret = (SListNode * )malloc(sizeof(SListNode));
  if(ret == NULL)
  {
    return NULL;
  }
  ret->data = x;
  ret->next =NULL;
  return ret;
}
// 单链表打印    
void SListPrint(SListNode* plist)
{
  SListNode * cur = plist;
  while(cur)
  {
    printf("%d->",cur->data);
    cur = cur->next;
  }
  printf("NULL\n");
}
// 单链表尾插    
void SListPushBack(SListNode** pplist, SLTDateType x)
{
  SListNode* newnode = BuySListNode(x);
  if(*pplist==NULL)
  {
    *pplist = newnode;
  }
  else 
  {
    SListNode*tail = *pplist;
    while(tail->next!=NULL)
    {
      tail = tail->next;
    }
    tail->next = newnode;
  }
}
// 单链表的头插   
//为什么要用二级指针呢，就像这个链表中的头插，如果没有传二级指针，你正在进行的操作就是对一个plist的
//复制品进行操作复制品和plist都指向一个地方，但是复制品链接的不是plist链接的，我们最后用的是plist（复制品和plist的值一样，地址不一样）
//正是因为这样，所以我们才有了带头结点的单链表和不带头的单链表，如果开始我们给的值就是另一个的指针的地址，那就没问题了
void SListPushFront(SListNode** pplist, SLTDateType x)
{
  SListNode* newnode = BuySListNode(x);
  if(*pplist == NULL)
  {
    *pplist = newnode;
  }
  else 
  {
    newnode->next = *pplist;
    *pplist = newnode;
  }
}
// 单链表的尾删    
void SListPopBack(SListNode** pplist)
{
  SListNode * tail = *pplist;
  SListNode * prev = NULL;
  if(tail == NULL)
    return;
  else if(tail->next == NULL)
  {
    free(tail);
    *pplist = NULL;
  }
  else 
  {
    while(tail->next)
    {
      prev = tail;
      tail = tail->next;
    }
    free(tail);
    tail = NULL;
  }
}
// 单链表头删    
void SListPopFront(SListNode** pplist)
{
  SListNode * first = *pplist;
  if(first == NULL)
  {
    return ;
  }
  else if(first->next == NULL)
  {
    free(first);
    *pplist = NULL;
  }
  else 
  {
    SListNode *next = first->next;
    free(first);
    *pplist = next;
  }
}
// 单链表查找    
SListNode* SListFind(SListNode* plist, SLTDateType x)
{
  SListNode * cur = plist;
  while(cur)
  {
    if(cur->data == x)
      return cur;
    cur = cur->next;
  }
  return NULL;
}
// 单链表在pos位置之后插入x      
// 分析思考为什么不在pos位置之前插入？      
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
  assert(pos);
  SListNode* next = pos->next;
  SListNode * newnode = BuySListNode(x);
  pos->next = newnode;
  newnode->next = next;
}
// 单链表删除pos位置之后的值      
// 分析思考为什么不删除pos位置？      
void SListEraseAfter(SListNode* pos)
{
  assert(pos);
  SListNode* next = pos->next;

  if(next != NULL)
  {
    SListNode * nextnext = next->next->next;
    free(next);
    pos->next = nextnext;
  }
}
// 单链表的销毁               
void SListDestroy(SListNode* plist)
{
  assert(plist);
  SListNode * cur = plist;
  while(plist)
  {
    cur = plist->next;
    free(plist);
    plist = cur;
  }
}
